﻿//Copyright 2009 Kristian Gundry And Rune Juhl-Petersen
//This file is part of Plain.

//Plain is free software: you can redistribute it and/or modify
//it under the terms of the GNU Lesser General Public License as published by
//the Free Software Foundation, either version 3 of the License, or
//any later version.

//Plain is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU Lesser General Public License for more details.

//You should have received a copy of the GNU Lesser General Public License
//along with Plain.  If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Castle.DynamicProxy;
using Castle.Core.Interceptor;

namespace Plain {
    public static class Wrapper {
        /// <summary>
        /// Wraps an interface around a class. You can use this if you have a class and an interface that have similar signatures
        /// but otherwise don't have any associations with each other.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        /// <returns>a proxy that will forward all calls to the underlying object</returns>
        public static T WrapAs<T>(this object o) { 
            ProxyGenerator generator = new ProxyGenerator();
            T proxy = generator.CreateInterfaceProxyWithoutTarget<T>(new MyInterceptor(o));
            return proxy; 
        }


    }
    public class MyInterceptor : IInterceptor {
        object o = null;
        public MyInterceptor(object o) {
            this.o = o;
        }
      
        #region IInterceptor Members

        public void Intercept(IInvocation invocation) {
            invocation.ReturnValue = o.GetType().GetMethod(invocation.Method.Name).Invoke(o, invocation.Arguments);
        }

        #endregion
    }
}
